package com.example.roadeyeserver.util;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.example.roadeyeserver.constant.ProjectConstant;
import com.example.roadeyeserver.entity.request.CommonRequest;
import org.springframework.util.StringUtils;

import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.Date;

public class QueryUtil {

    /**
     * 判断请求参数是否合法
     * @param request
     * @return
     */
    public static String isValid(CommonRequest request) {
        // 获取查询的时间类型
        String timeType = request.getTimeType();
        if (StringUtils.isEmpty(timeType)) {
            return "查询时间的类型不可少!";
        }
        // 开始时间
        String startTime = request.getStartTime();
        Date startDate = DateUtil.parse(startTime);
        LocalDate startLocalDate = convertToLocalDate(startDate);
        // 结束时间
        String endTime = request.getEndTime();
        Date endDate = DateUtil.parse(endTime);
        LocalDate endLocalDate = convertToLocalDate(endDate);
        // 开始时间和结束时间不为空
        if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {
            return "开始时间和结束时间不可少!";
        }
        // 结束时间不得早于开始时间
        if (startDate.after(endDate)) {
            return "结束时间不得早于开始时间!";
        }
        switch (timeType) {
            case ProjectConstant.HOUR: {
                // 如果类型是小时,那么开始时间和结束时间的间隔不得横跨24个整的小时
                boolean flag = DateUtil.between(startDate, endDate, DateUnit.HOUR) > 24;
                if (flag) {
                    return "开始时间和结束时间间隔不得横跨24个整的小时!";
                }
                break;
            }
            case ProjectConstant.DAY: {
                // 如果类型是天,那么开始时间和结束时间的间隔不得大于31天
                boolean flag = DateUtil.between(startDate, endDate, DateUnit.DAY) > 31;
                if (flag) {
                    return "开始时间和结束时间间隔不得大于31天!";
                }
                break;
            }
            case ProjectConstant.MONTH: {
                // 如果类型是月,那么开始时间和结束时间的间隔不得大于12个月
                Period period = Period.between(startLocalDate, endLocalDate);
                int totalMonths = period.getMonths() + period.getYears() * 12;
                boolean flag = totalMonths > 12;
                if (flag) {
                    return "开始时间和结束时间间隔不得大于12个月!";
                }
                break;
            }
        }
        return ProjectConstant.TRUE;
    }

    public static LocalDate convertToLocalDate(Date date) {
        return date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();
    }

}
